﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SEG.Model;
using Common.DataAccess;

namespace SEG.DataAccess
{
    public class AdministrarUsuariosDataAccess : GenericEntityManagerDataAccess<Usuario, AdministrarUsuariosCriteria, AdministrarUsuariosView, SEGContext>
    {
        protected override Usuario ReadEntity(Guid id)
        {
            return ObjectContext.Usuarios.
                Include("Grupo").
                Where(usuario => usuario.ID_Usuario == id).
                FirstOrDefault();
        }

        public override List<AdministrarUsuariosView> Read(AdministrarUsuariosCriteria criteria)
        {
            return ObjectContext.Usuarios.
                Where(usuario => (String.IsNullOrEmpty(criteria.NombreUsuario) || usuario.NombreUsuario.Contains(criteria.NombreUsuario)) &&
                                 (String.IsNullOrEmpty(criteria.NroDocumento) || usuario.NroDocumento.Contains(criteria.NroDocumento))).
                Select(usuario => new AdministrarUsuariosView
                {
                    ID = usuario.ID_Usuario,
                    NombreApellido = usuario.NombreApellido,
                    NombreUsuario = usuario.NombreUsuario,
                    NroDocumento  = usuario.NroDocumento
                }).OrderBy(c => c.NombreApellido).ToList();
        }

        public override List<Usuario> ReadEntities()
        {
            var list = ObjectContext.Usuarios.ToList();
            return list;
        }

        public Usuario Read(AutenticarUsuarioParameter usuarioparameter)
        {
            return ObjectContext.Usuarios.
                Include("Grupo").
                Include("Grupo.Permiso").
                Include("Grupo.Permiso.Accion").
                Include("Grupo.Permiso.Formulario").
                Where(usuario => usuarioparameter.Contrasenia   == usuario.Contrasenia &&
                                 usuarioparameter.NombreUsuario == usuario.NombreUsuario).
                FirstOrDefault();
        }

        public override void Save(Usuario entity)
        {
            this.ValidateNombreUsuario(entity);
            base.Save(entity);
        }

        private void ValidateNombreUsuario(Usuario entity)
        {
            if (ObjectContext.Usuarios.Any(us => us.NombreUsuario.ToUpper() == entity.NombreUsuario.ToUpper() && us.ID_Usuario != entity.ID_Usuario))
            {
                throw new Exception("Ya existe un usuario con el nombre de usuario ingresado.");
            }
        }
    }
}
